home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / tsptp.zip / DHRY.PAS < prev    next >
Pascal/Delphi Source File  |  1993-04-09  |  25KB  |  574 lines

  1. (******************************************************************************)
  2. (*                                                                            *)
  3. (*                   "DHRYSTONE" Benchmark Program                            *)
  4. (*                   -----------------------------                            *)
  5. (*                                                                            *)
  6. (*  Version:   Pascal/ 2 (Measurement Version, for MS-DOS in one file)        *)
  7. (*                                                                            *)
  8. (*  File:      Dhry.mod                                                       *)
  9. (*                                                                            *)
  10. (*  Date:      Apr. 1990                                                      *)
  11. (*                                                                            *)
  12. (*  Author:    Reinhold P. Weicker                                            *)
  13. (*             (Translated from the C & Pascal versions by P.S. Wilson)       *)
  14. (*                                                                            *)
  15. (******************************************************************************)
  16. (*                                                                            *)
  17. (*  The following program contains statements of a high level programming     *)
  18. (*  language (here: Pascal) in a distribution considered representative:      *)
  19. (*                                                                            *)
  20. (*    assignments                  52 (55.3 %)                                *)
  21. (*    control statements           24 (25.5 %)                                *)
  22. (*    procedure, function calls    18 (19.1 %)                                *)
  23. (*                                                                            *)
  24. (*  102 statements are dynamically executed. The program is balanced with     *)
  25. (*  respect to the three aspects:                                             *)
  26. (*                                                                            *)
  27. (*    - statement type                                                        *)
  28. (*    - operand type                                                          *)
  29. (*    - operand locality                                                      *)
  30. (*         operand global, local, parameter, or constant.                     *)
  31. (*                                                                            *)
  32. (*  The combination of these three aspects is balanced only approximately.    *)
  33. (*                                                                            *)
  34. (*  1. Statement Type:                                                        *)
  35. (*  -----------------             number                                      *)
  36. (*                                                                            *)
  37. (*     V1 := V2                    9                                          *)
  38. (*       (incl. V1 := F(..)                                                   *)
  39. (*     V := Constant              12                                          *)
  40. (*     Assignment,                 7                                          *)
  41. (*       with array element                                                   *)
  42. (*     Assignment,                 6                                          *)
  43. (*       with record component                                                *)
  44. (*                                --                                          *)
  45. (*                                34       34                                 *)
  46. (*                                                                            *)
  47. (*     X := Y +|-|AND|OR Z         5                                          *)
  48. (*     X := Y +|-|= Constant       6                                          *)
  49. (*     X := X +|- 1                3                                          *)
  50. (*     X := Y *|DIV Z              2                                          *)
  51. (*     X := Expression,            1                                          *)
  52. (*           two operators                                                    *)
  53. (*     X := Expression,            1                                          *)
  54. (*           three operators                                                  *)
  55. (*                                --                                          *)
  56. (*                                18       18                                 *)
  57. (*                                                                            *)
  58. (*     IF ....                    12                                          *)
  59. (*       with "ELSE"          6                                               *)
  60. (*       without "ELSE"       6                                               *)
  61. (*           executed           2                                             *)
  62. (*           not executed       4                                             *)
  63. (*     FOR ...                     6  |  counted every time                   *)
  64. (*     WHILE ...                   4  |  the loop condition                   *)
  65. (*     REPEAT ... UNTIL            1  |  is evaluated                         *)
  66. (*     CASE ...                    1                                          *)
  67. (*                                                                            *)
  68. (*                                --                                          *)
  69. (*                                24       24                                 *)
  70. (*                                                                            *)
  71. (*     P (...)  procedure call    12                                          *)
  72. (*       user procedure       10                                              *)
  73. (*       library procedure     2                                              *)
  74. (*     X := F (...)                                                           *)
  75. (*             function  call      6                                          *)
  76. (*       user function         5                                              *)
  77. (*       library function      1                                              *)
  78. (*                                --                                          *)
  79. (*                                18       18                                 *)
  80. (*                                        ---                                 *)
  81. (*                                         94                                 *)
  82. (*                                                                            *)
  83. (*    The average number of parameters in procedure or function calls         *)
  84. (*    is 1.82 (not counting the function values as implicit parameters).      *)
  85. (*                                                                            *)
  86. (*                                                                            *)
  87. (*  2. Operators                                                              *)
  88. (*  ------------                                                              *)
  89. (*                          number    approximate                             *)
  90. (*                                    percentage                              *)
  91. (*                                                                            *)
  92. (*    Arithmetic             31          50.8                                 *)
  93. (*                                                                            *)
  94. (*       +                     20          32.8                               *)
  95. (*       -                      7          11.5                               *)
  96. (*       *                      3           4.9                               *)
  97. (*       DIV (int div)          1           1.6                               *)
  98. (*                                                                            *)
  99. (*    Comparison             26           42.6                                *)
  100. (*                                                                            *)
  101. (*       =                      9           14.8                              *)
  102. (*       #                      4            6.6                              *)
  103. (*       >                      1            1.6                              *)
  104. (*       <                      3            4.9                              *)
  105. (*       >=                     1            1.6                              *)
  106. (*       <=                     8           13.1                              *)
  107. (*                                                                            *)
  108. (*    Logic                   4            6.6                                *)
  109. (*                                                                            *)
  110. (*       AND                    1            1.6                              *)
  111. (*       OR                     1            1.6                              *)
  112. (*       NOT                    2            3.3                              *)
  113. (*                                                                            *)
  114. (*                           --          -----                                *)
  115. (*                           61          100.0                                *)
  116. (*                                                                            *)
  117. (*                                                                            *)
  118. (*  3. Operand Type (counted once per operand reference):                     *)
  119. (*  ---------------                                                           *)
  120. (*                          number    approximate                             *)
  121. (*                                    percentage                              *)
  122. (*                                                                            *)
  123. (*     Integer               171        71.8 %                                *)
  124. (*     Character              45        18.9 %                                *)
  125. (*     Pointer                12         5.0 %                                *)
  126. (*     String30                6         2.5 %                                *)
  127. (*     Array                   2         0.8 %                                *)
  128. (*     Record                  2         0.8 %                                *)
  129. (*                           ---       -------                                *)
  130. (*                           238        99.8 %                                *)
  131. (*                                                                            *)
  132. (*  When there is an access path leading to the final operand (e.g. a record  *)
  133. (*  component), only the final data type on the access path is counted.       *)
  134. (*                                                                            *)
  135. (*                                                                            *)
  136. (*  4. Operand Locality:                                                      *)
  137. (*  -------------------                                                       *)
  138. (*                                number    approximate                       *)
  139. (*                                          percentage                        *)
  140. (*                                                                            *)
  141. (*     local variable              111        46.6 %                          *)
  142. (*     global variable              21         8.8 %                          *)
  143. (*     parameter                    45        18.9 %                          *)
  144. (*        value                        23         9.7 %                       *)
  145. (*        reference                    22         9.2 %                       *)
  146. (*     function result               6         2.5 %                          *)
  147. (*     constant                     55        23.1 %                          *)
  148. (*                                 ---       -------                          *)
  149. (*                                 238        99.9 %                          *)
  150. (*                                                                            *)
  151. (*                                                                            *)
  152. (*  The program does not compute anything meaningful, but it is syntactically *)
  153. (*  and semantically correct. All variables have a value assigned to them     *)
  154. (*  before they are used as a source operand.                                 *)
  155. (*                                                                            *)
  156. (*  There may be cases where a highly optimizing compiler may recognize       *)
  157. (*  unnecessary statements and may not generate code for them.                *)
  158. (*                                                                            *)
  159. (*  There has been no explicit effort to account for the effects of a         *)
  160. (*  cache, or to balance the use of long or short displacements for code or   *)
  161. (*  data.                                                                     *)
  162. (*                                                                            *)
  163. (******************************************************************************)
  164.  
  165. PROGRAM Dhry(Output);
  166.  
  167. (******************************************************************************)
  168. (*                                TIMING                                      *)
  169. (******************************************************************************)
  170.  
  171. (*$IFNDEF TopSpeed *)
  172.  (*%F TRUE   *** Compile for Turbo Pascal ***)
  173.   USES TPBench;
  174.  (*%E*)
  175. (*$ELSE     *** Compile for TopSpeed Pascal ***)
  176.   IMPORT TSBench *;
  177. (*$ENDIF *)
  178.  
  179. (******************************************************************************)
  180.  
  181. (* Global type definitions *)
  182.  
  183.   TYPE
  184.     Enumeration     = (Ident_1, Ident_2, Ident_3, Ident_4, Ident_5);
  185.     One_To_Thirty   = 1..30;
  186.     One_To_Fifty    = 1..50;
  187.     Capital_Letter  = 'A'..'Z';
  188.     Str30           = ARRAY [One_To_Thirty] OF CHAR;
  189.     Array1DimInt    = ARRAY [One_To_Fifty] OF BmInt;
  190.     Array2DimInt    = ARRAY [One_To_Fifty, One_To_Fifty] OF BmInt;
  191.     Record_Pointer  = ^Record_Type;
  192.     Record_Type     = RECORD
  193.       Pointer_Comp: Record_Pointer;
  194.       CASE Discr:  Enumeration OF
  195.           Ident_1:
  196.           ( Enum_Comp: Enumeration;
  197.             Int_Comp: One_To_Fifty;
  198.             String_Comp: Str30
  199.           );
  200.           Ident_2:
  201.           ( Enum_Comp_2: Enumeration;
  202.             String_Comp_2: Str30
  203.           );
  204.           Ident_3, Ident_4, Ident_5:
  205.           ( Char_Comp_1,
  206.             Char_Comp_2: CHAR
  207.           );
  208.     END;
  209.  
  210. (* Global Variables *)
  211.  
  212.   VAR
  213.     Pointer_Glob,
  214.     Next_Pointer_Glob:  Record_Pointer;
  215.     Int_Glob:           BmInt;
  216.     Bool_Glob:          BOOLEAN;
  217.     Char_Glob_1,
  218.     Char_Glob_2:        CHAR;
  219.     Array_Glob_1:       Array1DimInt;
  220.     Array_Glob_2:       Array2DimInt;
  221.  
  222.  
  223.   FUNCTION Func_1 (Char_Par_1_Val, Char_Par_2_Val: Capital_Letter): Enumeration;
  224.   (**************)
  225.     (* executed three times                                             *)
  226.     (* first call:      Char_Par_1_Val == 'H', Char_Par_2_Val == 'R'    *)
  227.     (* second call:     Char_Par_1_Val == 'A', Char_Par_2_Val == 'C'    *)
  228.     (* third call:      Char_Par_1_Val == 'B', Char_Par_2_Val == 'C'    *)
  229.  
  230.   VAR
  231.     Char_Loc_1, Char_Loc_2: Capital_Letter;
  232.  
  233.   BEGIN
  234.     Char_Loc_1 := Char_Par_1_Val;
  235.     Char_Loc_2 := Char_Loc_1;
  236.  
  237.     IF (Char_Loc_2 <> Char_Par_2_Val)
  238.     THEN (* executed *)
  239.       Func_1 := Ident_1
  240.     ELSE (* not executed *)
  241.       Func_1 := Ident_2;
  242.   END;
  243.  
  244.  
  245.   FUNCTION Func_2 (String_Par_1_Ref, String_Par_2_Ref: Str30): BOOLEAN;
  246.   (**************)
  247.     (* executed once *)
  248.     (* String_Par_1_Ref = 'DHRYSTONE PROGRAM, 1'ST STRING' *)
  249.     (* String_Par_2_Ref = 'DHRYSTONE PROGRAM, 2'ND STRING' *)
  250.  
  251.   VAR
  252.     Int_Loc:  One_To_Thirty;
  253.     Char_Loc: Capital_Letter;
  254.  
  255.   BEGIN
  256.     Int_Loc := 2;
  257.  
  258.     WHILE (Int_Loc <= 2) DO (* loop body executed once *)
  259.     BEGIN
  260.       IF Func_1(String_Par_1_Ref[Int_Loc], String_Par_2_Ref[Int_Loc+1]) = Ident_1 THEN
  261.       BEGIN (* executed *)
  262.         Char_Loc := 'A';
  263.         Int_Loc := Int_Loc + 1;
  264.       END   (* IF *)
  265.     END; (* WHILE *)
  266.  
  267.     IF (Char_Loc >= 'W') AND (Char_Loc < 'Z')
  268.     THEN (* not executed *)
  269.       Int_Loc := 7;
  270.  
  271.     IF Char_Loc = 'X'
  272.     THEN (* not executed *)
  273.       Func_2 := TRUE
  274.     ELSE (* executed *)
  275.     BEGIN
  276.       IF String_Par_1_Ref = String_Par_2_Ref THEN
  277.       BEGIN (* not executed *)
  278.         Int_Loc := Int_Loc + 7;
  279.         Func_2 := TRUE
  280.       END ELSE (* executed *)
  281.       BEGIN
  282.         Func_2 := FALSE
  283.       END (* IF String_Par_1 > String_Par_2 *)
  284.     END (* IF Char_Loc *)
  285.   END;
  286.  
  287.  
  288.   FUNCTION Func_3 (Enum_Par_Val: Enumeration): BOOLEAN;
  289.   (**************)
  290.     (* executed once           *)
  291.     (* Enum_Par_Val == Ident_3 *)
  292.  
  293.   VAR
  294.      Enum_Loc: Enumeration;
  295.  
  296.   BEGIN
  297.  
  298.     Enum_Loc := Enum_Par_Val;
  299.  
  300.     IF Enum_Loc = Ident_3 THEN
  301.     BEGIN (* executed *)
  302.       Func_3 := TRUE
  303.     END;
  304.  
  305.     Func_3 := FALSE
  306.   END;
  307.  
  308.  
  309.   PROCEDURE Proc_8 (Array_Par_1_Ref: Array1DimInt; Array_Par_2_Ref: Array2DimInt;
  310.                     Int_Par_Val_1, Int_Par_Val_2: BmInt);
  311.   (**************)
  312.     (* executed once *)
  313.     (* Int_Par_Val_1 = 3 *)
  314.     (* Int_Par_Val_2 = 7 *)
  315.  
  316.   VAR
  317.     Int_Index, Int_Loc: One_To_Fifty;
  318.  
  319.   BEGIN
  320.  
  321.     Int_Loc                       := Int_Par_Val_1 + 5;
  322.     Array_Par_1_Ref [Int_Loc]     := Int_Par_Val_2;
  323.     Array_Par_1_Ref [Int_Loc+1]   := Array_Par_1_Ref [Int_Loc];
  324.     Array_Par_1_Ref [Int_Loc+30]  := Int_Loc;
  325.  
  326.     FOR Int_Index := Int_Loc TO Int_Loc+1 DO (* loop twice *)
  327.       Array_Par_2_Ref [Int_Loc] [Int_Index] := Int_Loc;
  328.  
  329.     Array_Par_2_Ref [Int_Loc] [Int_Loc-1] := Array_Par_2_Ref [Int_Loc] [Int_Loc-1] + 1;
  330.     Array_Par_2_Ref [Int_Loc+20] [Int_Loc] := Array_Par_1_Ref [Int_Loc];
  331.     Int_Glob := 5
  332.   END;
  333.  
  334.  
  335.   PROCEDURE Proc_7 (Int_Par_Val1, Int_Par_Val2: One_To_Fifty;
  336.                     VAR Int_Par_Ref: One_To_Fifty);
  337.   (**************)
  338.     (* executed three times                                    *)
  339.     (* first call:      Int_Par_Val1 = 2, Int_Par_Val2 = 3,    *)
  340.     (*                  Int_Par_Ref becomes 7                  *)
  341.     (* second call:     Int_Par_Val1 = 6, Int_Par_Val2 = 10,   *)
  342.     (*                  Int_Par_Ref becomes 18                 *)
  343.     (* third call:      Int_Par_Val1 = 10, Int_Par_Val2 = 5,   *)
  344.     (*                  Int_Par_Ref becomes 17                 *)
  345.  
  346.   VAR
  347.     Int_Loc: One_To_Fifty;
  348.  
  349.   BEGIN
  350.     Int_Loc     := Int_Par_Val1 + 2;
  351.     Int_Par_Ref := Int_Par_Val2 + Int_Loc
  352.   END;
  353.  
  354.  
  355.   PROCEDURE Proc_6 (Enum_Par_Val: Enumeration; VAR Enum_Par_Ref: Enumeration);
  356.   (**************)
  357.     (* executed once *)
  358.     (* Enum_Par_Val = Ident_3, Enum_Par_Ref becomes Ident_2 *)
  359.  
  360.   BEGIN
  361.     Enum_Par_Ref := Enum_Par_Val;
  362.  
  363.     IF NOT Func_3 (Enum_Par_Val)
  364.     THEN (* not executed *)
  365.       Enum_Par_Ref := Ident_4;
  366.  
  367.     CASE Enum_Par_Val OF
  368.       Ident_1:
  369.         Enum_Par_Ref := Ident_1;
  370.       Ident_2:
  371.         IF Int_Glob > 100
  372.         THEN
  373.           Enum_Par_Ref := Ident_1
  374.         ELSE
  375.           Enum_Par_Ref := Ident_4;
  376.       Ident_3: (* executed *)
  377.         Enum_Par_Ref := Ident_2;
  378.       Ident_4, Ident_5:
  379.         Enum_Par_Ref := Ident_3;
  380.     END (* case *)
  381.   END;
  382.  
  383.  
  384.   PROCEDURE Proc_5; (* without parameters *)
  385.   (**************)
  386.     (* executed once *)
  387.  
  388.   BEGIN
  389.     Char_Glob_1 := 'A';
  390.     Bool_Glob   := FALSE
  391.   END;
  392.  
  393.  
  394.   PROCEDURE Proc_4; (* without parameters *)
  395.   (**************)
  396.     (* executed once *)
  397.  
  398.   VAR
  399.      Bool_Loc: BOOLEAN;
  400.  
  401.   BEGIN
  402.     Bool_Loc    := (Char_Glob_1 = 'A');
  403.     Bool_Loc    := (Bool_Loc OR Bool_Glob);
  404.     Char_Glob_2 := 'B'
  405.   END;
  406.  
  407.  
  408.   PROCEDURE Proc_3 (VAR Pointer_Par_Ref: Record_Pointer);
  409.   (**************)
  410.     (* executed once *)
  411.     (* Pointer_Par_Ref becomes Pointer_Glob *)
  412.  
  413.   BEGIN
  414.     IF Pointer_Glob <> NIL
  415.     THEN (* executed *)
  416.       Pointer_Par_Ref := Pointer_Glob^.Pointer_Comp
  417.     ELSE (* not executed *)
  418.       Int_Glob := 100;
  419.  
  420.     Proc_7(10, Int_Glob, Pointer_Glob^.Int_Comp)
  421.   END;
  422.  
  423.  
  424.   PROCEDURE Proc_2 (VAR Int_Par_Ref: One_To_Fifty);
  425.   (***************)
  426.     (* executed once *)
  427.     (* In_Par_Ref = 3, becomes 7 *)
  428.  
  429.   VAR
  430.     Int_Loc: One_To_Fifty;
  431.     Enum_Loc: Enumeration;
  432.  
  433.   BEGIN
  434.     Int_Loc := Int_Par_Ref + 10;
  435.     REPEAT (* executed once *)
  436.       IF Char_Glob_1 = 'A' THEN
  437.       BEGIN  (* executed *)
  438.         Int_Loc := Int_Loc - 1;
  439.         Int_Par_Ref := Int_Loc - Int_Glob;
  440.         Enum_Loc    := Ident_1
  441.       END (* if *)
  442.     UNTIL Enum_Loc = Ident_1 (* true *)
  443.   END;
  444.  
  445.  
  446.   PROCEDURE Proc_1 (Pointer_Par_Val: Record_Pointer);
  447.   (**************)
  448.     (* executed once *)
  449.   BEGIN
  450.     WITH Pointer_Par_Val^ DO
  451.     BEGIN
  452.       Pointer_Comp^               := Pointer_Glob^;
  453.       Pointer_Par_Val^.Int_Comp   := 5;
  454.       Pointer_Comp^.Int_Comp      := Pointer_Par_Val^.Int_Comp;
  455.       Pointer_Comp^.Pointer_Comp  := Pointer_Par_Val^.Pointer_Comp;
  456.  
  457.       Proc_3(Pointer_Comp^.Pointer_Comp);
  458.       (* Pointer_Par_Val^.Pointer_Comp^.Pointer_Comp
  459.         = Pointer_Glob^.Pointer_Comp *)
  460.  
  461.       IF Pointer_Comp^.Discr = Ident_1 THEN
  462.       BEGIN (* executed *)
  463.         Pointer_Comp^.Int_Comp      := 6;
  464.         Proc_6(Pointer_Par_Val^.Enum_Comp, Pointer_Comp^.Enum_Comp);
  465.         Pointer_Comp^.Pointer_Comp  := Pointer_Glob^.Pointer_Comp;
  466.         Proc_7(Pointer_Comp^.Int_Comp, 10, Pointer_Comp^.Int_Comp)
  467.       END ELSE (* not executed *)
  468.         Pointer_Par_Val^ := Pointer_Comp^;
  469.     END
  470.   END;
  471.  
  472.  
  473.   PROCEDURE Proc_0;
  474.   (**************)
  475.  
  476.   VAR
  477.     Int_Loc_1,
  478.     Int_Loc_2,
  479.     Int_Loc_3 :   One_To_Fifty;
  480.     Char_Index:   CHAR;
  481.     Enum_Loc: Enumeration;
  482.     String_Loc_1,
  483.     String_Loc_2: Str30;
  484.  
  485.     Iter        : BmInt;
  486.  
  487.   BEGIN
  488.   (* Initializations *)
  489.  
  490.     NEW(Next_Pointer_Glob);
  491.     NEW(Pointer_Glob);
  492.  
  493.     WITH Pointer_Glob^ DO
  494.     BEGIN
  495.       Pointer_Comp  := Next_Pointer_Glob;
  496.       Discr         := Ident_1;
  497.       Enum_Comp     := Ident_3;
  498.       Int_Comp      := 40;
  499.       String_Comp   := 'DHRYSTONE PROGRAM, SOME STRING'
  500.     END;
  501.  
  502.     Array_Glob_2[8][7] := 10;
  503.     String_Loc_1       := 'DHRYSTONE PROGRAM, 1`ST STRING';
  504.  
  505. (******************************************************************************)
  506. (*  Compute the looping overhead.  The Dummy procedure must have some side-   *)
  507. (*  effect so that it is not optimised out of existence.                      *)
  508. (******************************************************************************)
  509.  
  510.     StartTimer;                                 (* Start the clock.           *)
  511.  
  512.     REPEAT
  513.       Dummy;
  514.     UNTIL NullTimesUp;
  515.  
  516. (******************************************************************************)
  517. (*  Now run the benchmark.  Note that the Dummy procedure is also called so   *)
  518. (*  that we can eliminate its overhead from the looping overhead.             *)
  519. (******************************************************************************)
  520.  
  521.     StartTimer;                                 (* Start the clock.           *)
  522.  
  523.     REPEAT
  524.       Proc_5;
  525.       Proc_4;
  526.       (* Char_Glob_1 = 'A', Char_Glob_2 = 'B', Bool_Glob = FALSE *)
  527.       Int_Loc_1 := 2;
  528.       Int_Loc_2 := 3;
  529.  
  530.       String_Loc_2 := 'DHRYSTONE PROGRAM, 2`ND STRING';
  531.       Enum_Loc := Ident_2;
  532.       Bool_Glob := NOT Func_2(String_Loc_1, String_Loc_2);
  533.       (* Bool_Glob = TRUE *)
  534.  
  535.       WHILE Int_Loc_1 < Int_Loc_2 DO (* loop body executed once *)
  536.       BEGIN
  537.         Int_Loc_3 := 5 * Int_Loc_1 - Int_Loc_2;
  538.         (* Int_Loc_3 == 7 *)
  539.         Proc_7 (Int_Loc_1, Int_Loc_2, Int_Loc_3);
  540.         (* Int_Loc_3 == 7 *)
  541.         Int_Loc_1 := Int_Loc_1 + 1;
  542.       END; (* while *)
  543.  
  544.       (* Int_Loc_1 = 3 *)
  545.       Proc_8 (Array_Glob_1, Array_Glob_2, Int_Loc_1, Int_Loc_3);
  546.       (* Int_Glob == 5 *)
  547.       Proc_1 (Pointer_Glob);
  548.  
  549.       FOR Char_Index := 'A' TO Char_Glob_2 DO  (* loop body executed twice *)
  550.         IF Enum_Loc = Func_1 (Char_Index, 'C')
  551.         THEN  (* not executed *)
  552.           Proc_6 (Ident_1, Enum_Loc);
  553.  
  554.       (* Int_Loc_1 = 3, Int_Loc_2 = 3, Int_Loc_3 = 7 *)
  555.       Int_Loc_3 := Int_Loc_2 * Int_Loc_1;
  556.       Int_Loc_2 := Int_Loc_3 DIV Int_Loc_1;
  557.       Int_Loc_2 := 7 * (Int_Loc_3 - Int_Loc_2) - Int_Loc_1;
  558.       Proc_2 (Int_Loc_1);
  559.  
  560.       Dummy
  561.     UNTIL BenchTimesUp;
  562.   END;
  563.  
  564. BEGIN
  565.     WriteLn;
  566.     WriteLn('Dhrystone Benchmark (March 84), Version Pascal / 2');
  567.     WriteLn('All times are CPU times, in seconds');
  568.  
  569.     Proc_0;
  570.  
  571.     ReportTimes;
  572.  
  573. END.
  574.